<html>
<head><meta charset="utf-8"><title>predicate interning #72055 · t-compiler · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/index.html">t-compiler</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html">predicate interning #72055</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="198895825"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198895825" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198895825">(May 27 2020 at 14:10)</a>:</h4>
<p>So <span class="user-mention" data-user-id="216206">@lcnr</span> (cc <span class="user-mention" data-user-id="120989">@Nicholas Nethercote</span>) I'm a bit behind on notifications, I'm seeing the comments about perf impacts from <a href="https://github.com/rust-lang/rust/issues/72055">#72055</a> now -- I'm wondering though, before <a href="https://github.com/rust-lang/rust/pull/72494">https://github.com/rust-lang/rust/pull/72494</a> lands, do we maybe want to backout <a href="https://github.com/rust-lang/rust/issues/72055">#72055</a> and try to re-land it together with the relevant changes from <a href="https://github.com/rust-lang/rust/issues/72494">#72494</a>?</p>



<a name="198902614"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198902614" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198902614">(May 27 2020 at 14:51)</a>:</h4>
<p>Hm, <a href="https://github.com/rust-lang/rust/issues/72055">#72055</a> can't be automatically reverted anymore and I don't know how helpful merging these two PRs is.<br>
With my current knowledge I am slightly in favor of not backing out <a href="https://github.com/rust-lang/rust/issues/72055">#72055</a>.</p>



<a name="198917389"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198917389" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198917389">(May 27 2020 at 16:32)</a>:</h4>
<p>Do you have any thoughts <span class="user-mention" data-user-id="216206">@lcnr</span> about what remaining performance difference there is?</p>



<a name="198917462"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198917462" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198917462">(May 27 2020 at 16:32)</a>:</h4>
<p>The main benefit I see to backout-and-merge (which indeed might be painful) is that it would let us profile and get a picture of how to improve the remaining cost, if we can</p>



<a name="198918565"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198918565" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198918565">(May 27 2020 at 16:41)</a>:</h4>
<p>on wf stress tests it's probably still ~6%</p>



<a name="198918843"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198918843" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198918843">(May 27 2020 at 16:43)</a>:</h4>
<p>We may try to once again change <code>Predicate</code> to contain <code>PredicateKind</code> directly and intern <code>Predicate</code>. This may give us a slightly better performance than what we have currently.</p>



<a name="198919039"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198919039" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198919039">(May 27 2020 at 16:45)</a>:</h4>
<p>I also looked into changing <code>TypeFoldable</code> to operate on <code>Self</code> directly. This is mostly unrelated and we are still pretty far away from that</p>



<a name="198919265"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198919265" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198919265">(May 27 2020 at 16:46)</a>:</h4>
<p>Or we look into emitting fewer trivial predicates, which is something I would like to do in seperate PRs</p>



<a name="198919505"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198919505" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198919505">(May 27 2020 at 16:48)</a>:</h4>
<blockquote>
<p>We may try to once again change Predicate to contain PredicateKind directly and intern Predicate. This may give us a slightly better performance than what we have currently.</p>
</blockquote>
<p>is the only option I can think of for which a backout is beneficial</p>



<a name="198944384"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198944384" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198944384">(May 27 2020 at 19:56)</a>:</h4>
<p>How much of the impact do you think comes from double indirection vs re-interning?</p>



<a name="198944399"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198944399" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198944399">(May 27 2020 at 19:56)</a>:</h4>
<p>I would have expected more the latter</p>



<a name="198944694"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198944694" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198944694">(May 27 2020 at 19:58)</a>:</h4>
<p><span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span> <span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span> <span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span> <span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span> I guess interning is the bigger problem, as afaict most predicates are only looked at a few times and then discarded</p>



<a name="198944974"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198944974" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198944974">(May 27 2020 at 20:00)</a>:</h4>
<p>Depending on how frequent <code>Forall</code>/<code>Exists</code> predicates will be, we may also try and simply box the inner predicates in these cases, and keep them on the stack otherwise</p>



<a name="198950141"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198950141" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198950141">(May 27 2020 at 20:40)</a>:</h4>
<p>I think interning is the better strategy overall</p>



<a name="198950173"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198950173" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198950173">(May 27 2020 at 20:40)</a>:</h4>
<p>simpler to think about, for one thing =)</p>



<a name="198950686"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198950686" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198950686">(May 27 2020 at 20:44)</a>:</h4>
<blockquote>
<p>Or we look into emitting fewer trivial predicates, which is something I would like to do in seperate PRs</p>
</blockquote>
<p>Will spend some time looking into this then, I feel like this should still have some low hanging fruits</p>



<a name="198961024"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198961024" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> njn <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198961024">(May 27 2020 at 22:22)</a>:</h4>
<p>I come from Firefox where backouts are very common, so my tolerance for them is much higher than the average person's :)</p>



<a name="198961145"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198961145" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> njn <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198961145">(May 27 2020 at 22:23)</a>:</h4>
<p>The wf-stress benchmark isn't very important, the "real world" benchmarks like serde and futures are much more important</p>



<a name="198961364"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/198961364" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> njn <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#198961364">(May 27 2020 at 22:25)</a>:</h4>
<p>I recommend Cachegrind diffs for understanding what has changed. I use it all the time but nobody else does :(</p>



<a name="199171680"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199171680" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199171680">(May 29 2020 at 15:40)</a>:</h4>
<p>Hmm and it seems like on serde at least we saw about 7% regression and only about 1% recouped</p>



<a name="199171785"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199171785" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199171785">(May 29 2020 at 15:41)</a>:</h4>
<p>seems to be focused in <code>typeck_tables_of</code></p>



<a name="199180948"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199180948" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199180948">(May 29 2020 at 16:50)</a>:</h4>
<p><span class="user-mention" data-user-id="116009">@nikomatsakis</span> I found something we've missed in <a href="https://github.com/rust-lang/rust/issues/72055">#72055</a>:</p>
<p><a href="https://github.com/rust-lang/rust/pull/72743">https://github.com/rust-lang/rust/pull/72743</a> don't know if this is actually responsible for any perf changes though <span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span></p>



<a name="199181231"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199181231" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199181231">(May 29 2020 at 16:52)</a>:</h4>
<p>tbh I am in general still fairly confused by both the encoding and query system <span aria-label="sweat smile" class="emoji emoji-1f605" role="img" title="sweat smile">:sweat_smile:</span></p>



<a name="199194735"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199194735" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199194735">(May 29 2020 at 18:41)</a>:</h4>
<p>I wonder <span class="user-mention" data-user-id="216206">@lcnr</span> if there are new calls to <code>to_predicate</code> occuring, perhaps after folding?, that are very frequent in typeck and that accounts for the overhead.</p>



<a name="199198593"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199198593" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199198593">(May 29 2020 at 19:11)</a>:</h4>
<p>That's a good catch, I didn't check <code>TypeFoldable</code>. Opened <a href="https://github.com/rust-lang/rust/pull/72754">https://github.com/rust-lang/rust/pull/72754</a></p>
<p>pls perf</p>



<a name="199206083"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199206083" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199206083">(May 29 2020 at 20:12)</a>:</h4>
<p>thx <span class="user-mention" data-user-id="211727">@Jonas Schievink</span> <span aria-label="heart" class="emoji emoji-2764" role="img" title="heart">:heart:</span></p>



<a name="199257732"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199257732" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199257732">(May 30 2020 at 13:49)</a>:</h4>
<blockquote>
<p>Or we look into emitting fewer trivial predicates, which is something I would like to do in seperate PRs</p>
</blockquote>
<p>Spend some time looking into this today.</p>



<a name="199257857"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199257857" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199257857">(May 30 2020 at 13:52)</a>:</h4>
<p>The most relevant predicates are <code>PredicateKind::Trait</code> and <code>PredicateKind::WellFormed</code>, which are more than 90% of all interned predicates:</p>
<div class="codehilite"><pre><span></span><code>8915319 counts:
(  1)  7283539 (81.7%, 81.7%): [WARN  rustc_middle::ty] Trait
(  2)  1048015 (11.8%, 93.5%): [WARN  rustc_middle::ty] WellFormed
(  3)   252852 ( 2.8%, 96.3%): [WARN  rustc_middle::ty] Projection
(  4)   219483 ( 2.5%, 98.8%): [WARN  rustc_middle::ty] TypeOutlives
(  5)    50944 ( 0.6%, 99.3%): [WARN  rustc_middle::ty] RegionOutlives
(  6)    31204 ( 0.4%, 99.7%): [WARN  rustc_middle::ty] Subtype
(  7)    16998 ( 0.2%, 99.9%): [WARN  rustc_middle::ty] ClosureKind
(  8)     8848 ( 0.1%,100.0%): [WARN  rustc_middle::ty] ObjectSafe
(  9)     2917 ( 0.0%,100.0%): [WARN  rustc_middle::ty] ConstEquate
( 10)      519 ( 0.0%,100.0%): [WARN  rustc_middle::ty] ConstEvaluatable
</code></pre></div>



<a name="199257943"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199257943" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199257943">(May 30 2020 at 13:54)</a>:</h4>
<p>Once <a href="https://github.com/rust-lang/rust/issues/70107">#70107</a> lands <code>WellFormed</code> will be instantiated even more frequently</p>



<a name="199258056"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199258056" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199258056">(May 30 2020 at 13:57)</a>:</h4>
<p>Will then try to skip trivial WF predicates and see how much this changes, don't feel comfortable with emitting fewer <code>Trait</code> predicates as they aren't as local and we can easily cause unsoundness if we mess this up, so I don't think that's worth it</p>



<a name="199258059"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199258059" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199258059">(May 30 2020 at 13:57)</a>:</h4>
<p>Don't care about other predicates for now <span aria-label="shrug" class="emoji emoji-1f937" role="img" title="shrug">:shrug:</span></p>



<a name="199402003"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199402003" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199402003">(Jun 01 2020 at 18:01)</a>:</h4>
<p><span class="user-mention" data-user-id="216206">@lcnr</span> it seems like <code>TypeFoldable</code> was a real win</p>



<a name="199402042"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199402042" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> lcnr <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199402042">(Jun 01 2020 at 18:01)</a>:</h4>
<p>yes yes</p>



<a name="199402215"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/131828-t-compiler/topic/predicate%20interning%20%2372055/near/199402215" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/131828-t-compiler/topic/predicate.20interning.20.2372055.html#199402215">(Jun 01 2020 at 18:02)</a>:</h4>
<p>that's good</p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>